{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# {class}`tvm::runtime::ObjectPtr`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "{class}`tvm::runtime::ObjectPtr` 是自定义智能指针的实现，用于管理 {class}`tvm::runtime::Object`；它接受模板参数 `T`，表示内容数据的类型。\n",
    "\n",
    "`ObjectPtr` 类提供了一些成员函数和算子重载，以支持对象的创建、拷贝、移动和析构等运算。以下是对其中一些重要成员函数和算子的解读：\n",
    "\n",
    "- 默认构造函数 `ObjectPtr()` 和 `ObjectPtr(std::nullptr_t)` 分别创建空指针和指向空指针的对象。\n",
    "- 拷贝构造函数 `ObjectPtr(const ObjectPtr& other)` 和 `ObjectPtr(const ObjectPtr<U>& other)` 允许将一个对象赋值给另一个对象，其中 `U` 是 `T` 的派生类型。在拷贝构造函数中，使用了静态断言来确保只能进行子类到父类的赋值。\n",
    "- 移动构造函数 `ObjectPtr(ObjectPtr&& other)` 和 `ObjectPtr(ObjectPtr<Y>&& other)` 允许将一个对象移动到另一个对象，其中 `Y` 是 `T` 的派生类型。同样，在移动构造函数中，使用了静态断言来确保只能进行子类到父类的移动。\n",
    "- 析构函数 `~ObjectPtr()` 负责释放指针所指向的对象的资源。\n",
    "- 交换运算符 `void swap(ObjectPtr& other)` 用于交换两个对象的内容。\n",
    "- 解引用运算符 `T* operator->() const` 返回指向对象内容的指针。\n",
    "- 取引用运算符 `T& operator*() const` 返回指向对象内容的引用。\n",
    "- 拷贝赋值运算符 `ObjectPtr& operator=(const ObjectPtr& other)` 和移动赋值运算符 `ObjectPtr& operator=(ObjectPtr&& other)` 分别用于拷贝或移动一个对象到另一个对象。\n",
    "- 空指针检查运算符 `explicit operator bool() const` 返回一个布尔值，指示指针是否为空。\n",
    "- 重置函数 `void reset()` 将指针内容设置为空指针。\n",
    "- 使用计数函数 `int use_count() const` 返回指针的使用计数，用于调试目的。\n",
    "- 唯一性检查函数 `bool unique() const` 检查指针是否唯一，即没有其他对象共享该指针。\n",
    "- 相等性比较运算符 `bool operator==(const ObjectPtr& other) const` 和不等性比较运算符 `bool operator!=(const ObjectPtr& other) const` 分别用于比较两个对象是否相等或不相等。\n",
    "- 空指针比较运算符 `bool operator==(std::nullptr_t null) const` 和不等于运算符 `bool operator!=(std::nullptr_t null) const` 分别用于检查指针是否为空或非空。\n",
    "\n",
    "此外，还定义了一些私有成员变量和辅助函数，用于管理内部指针字段的创建、引用计数的增加和减少等操作。\n",
    "\n",
    "总体而言，这个自定义智能指针提供了一种方便的方式来管理对象，并提供了常见的操作和功能，如拷贝、移动、重置和唯一性检查等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "plaintext"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
